import 'dart:ui';

import 'package:flutter/cupertino.dart';
import 'package:flutter_demo/pages/page_with_title.dart';
import 'package:flutter_demo/widgets/app_widgets.dart';

class LifecycleListenerPage extends PageWithTitle {
  const LifecycleListenerPage() : super("应用生命周期监听(AppLifecycleListener)");

  @override
  List<Widget> buildContentWidgets(BuildContext context) {
    return const [
      PrimaryTitle("简介"),
      BodyText("演示如何监听页面生命周期变化"),

      AppSpacer.large,
      LabelText("将应用切换到后台再切换回来可以看到生命周期变化"),
      _Example(),
      UlItem("AppLifecycleListener"),
      BodyText("Flutter框架提供了一个监听器用于监听应用生命周期变化"),
      LabelText("- binding，组件绑定器，默认使用WidgetsBinding.instance进行生命周期监听"),
      LabelText("- onStateChange，监听状态变化"),
      LabelText("  - detached，应用初始状态，此时APP没有任何渲染"),
      LabelText("  - paused，应用处于后台，不做任何刷帧操作（这个状态只有在Android ios上用"
          "到，若要判断程序进入后台运行应该统一使用hidden比较好）"),
      LabelText("  - hidden，应用处于不可见状态"),
      LabelText("  - inactive，应用处于非活跃状态，但此时仍然有部分视图可见"),
      LabelText("  - resumed，应用处于前台显示"),
      NoticeText("监听生命周期事件"),
      LabelText("- onRestart，仅限移动端，应用程序从paused状态恢复时触发这个事件，与其对应的函数是onPause"),
      LabelText("- onPause，仅限移动端，应用程序即将进入paused状态"),
      AppSpacer.mini,
      LabelText("- onShow，应用程序从hidden状态恢复显示时触发这个事件，与其对应的函数是onHide"),
      LabelText("- onHide，应用程序即将进入hidden状态"),
      AppSpacer.mini,
      LabelText("- onResume，应用程序从inactive状态前台显示时触发这个事件，与其对应的函数是onInactive"),
      LabelText("- onInactive，应用程序即将进入inactive状态"),
      AppSpacer.mini,
      LabelText("- onDetach，仅限移动端，应用程序即将结束运行"),
      NoticeText("可拦截的应用退出处理"),
      LabelText("- onExitRequested，这是一个异步回调，返回AppExitResponse.exit表示正常"
          "退出程序，在函数中可以执行状态保存之类的操作再结束应用程序。若返回AppExitResponse"
          ".cancel则表示取消退出应用的操作。这个回调并不会总是执行，比如杀进程就不会执行，但若"
          "是windows那样的关机时触发应用程序退出请求，就可以进行存档操作。"),
    ];
  }
}

class _Example extends StatefulWidget {
  const _Example();

  @override
  State<StatefulWidget> createState() {
    return _ExampleState();
  }
}

class _ExampleState extends State<_Example> {
  final List<String> _stateList = [];
  late AppLifecycleListener _lifecycleListener;

  @override
  void initState() {
    super.initState();
    _lifecycleListener = AppLifecycleListener(
      onRestart: ()=>_pushState("应用即将恢复"),
       onShow: ()=>_pushState("应用即将显示"),
        onResume: ()=>_pushState("应用进入前台"),
        onInactive: ()=>_pushState("应用处于非活跃状态"),
       onHide: ()=>_pushState("应用即将暂停"),
      onPause: ()=>_pushState("应用退到后台"),
      onDetach: ()=>_pushState("应用即将退出"),
      onExitRequested: () async {
        _pushState("应用请求退出");
        return AppExitResponse.exit;
      },
      onStateChange: (state) {
        _pushState(state.name);
        _pushState("");
      },
    );
  }

  @override
  void dispose() {
    super.dispose();
    ///要记得取消监听
    _lifecycleListener.dispose();
  }

  _pushState(String s) {
    ///组件树从视图上移除挂载状态，此时是无法通过setState更新组件的
    if(mounted){
      setState(() {
        _stateList.add(s);
      });
    }else{
      _stateList.add(s);
    }
  }

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 300,
      child: ListView.builder(
        itemCount: _stateList.length,
        itemBuilder: (context, index) {
          return Text(_stateList[index]);
        },
      ),
    );
  }
}
